package main
import (
	"fmt"
)

//单链表的操作
func main(){
	//1、先创建一个头节点
	head := &HeroNode{}
	//2、创建一个新的HeroNode
	hero1 := &HeroNode{
		no : 1,
		name : "宋江",
		nickname : "及时雨",
	}
	hero2 := &HeroNode{
		no : 2,
		name : "卢俊义",
		nickname : "玉麒麟",
	}
	hero3 := &HeroNode{
		no : 3,
		name : "林冲",
		nickname : "豹子头",
	}
	//3、加入
	InsertNode2(head,hero3)
	InsertNode2(head,hero1)
	InsertNode2(head,hero2)
	//4、显示链表
	ListLink(head)
	//5、输出结点
	DelHeroNode(head,2)
	DelHeroNode(head,4)
	ListLink(head)
}

type HeroNode struct{
	no int
	name string
	nickname string
	next *HeroNode
}

//给链表插入一个节点
//方式1：在单链表的最后加入
func InsertNode(head *HeroNode,newhero *HeroNode){
	//1)先找到该链表的最后一个节点
	//2）创建一个辅助节点
	temp := head
	for {
		if temp.next == nil{
			break
		}
		temp = temp.next
	}
	//3) 将newHeroNode加入到链表的最后
	temp.next = newhero
}

//给链表插入一个节点
//方式2：将插入的节点按no排序插入
func InsertNode2(head *HeroNode,newhero *HeroNode){
	//1)找到适当的结点
	//2）创建一个辅助节点
	temp := head
	for {
		if temp.next == nil{ //说明到链表的最后
			break
		}else if temp.next.no >= newhero.no{
			//说明newhero应该插在temp后面
			break
		}
		temp = temp.next
	}
	//3) 将newHeroNode加入到链表的最后
	newhero.next = temp.next
	temp.next = newhero 
}


//显示链表的所有节点信息
func ListLink(head *HeroNode){
	temp := head
	//先判断该链表是不是空链表
	if temp.next == nil{
		fmt.Println("链表是空的呢了~")
		return
	}
	for {
		fmt.Printf("Node%d: name:%s-nickname:%s-->",temp.next.no,temp.next.name,temp.next.nickname)
		temp = temp.next
		if temp.next == nil{
			fmt.Println("\n链表已经走到头了~")
			break
		}
	}
}

//删除结点
func DelHeroNode(head *HeroNode,no int){
	temp := head
	flag := false
	for {
		if temp.next == nil{
			break
		}else if temp.next.no == no{
			flag = true
			break
		}
		temp = temp.next
	}
	if flag{
		temp.next = temp.next.next
		fmt.Println("找到该编号的结点了~")
	}else{
		fmt.Println("链表中不存在该结点~")
	}
}